package com.allen.study.test_common.utils.excel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.allen.study.test_common.exception.CustomRuntimeException;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * @ClassName: EasyExcelUtils
 * @Author: AllenSun
 * @Date: 2025/2/27 下午8:57
 */
@Slf4j
public class EasyExcelUtils {


    /**
     * 通用的 Excel 导出方法
     * @param response 输出流，用于将 Excel 数据输出到指定位置
     * @param head 表头对应的类，用于指定 Excel 表头和数据的映射关系
     * @param data 要导出的数据列表
     * @param sheetName 工作表的名称
     * @param <T> 数据类型的泛型
     */
    public static <T> void exportExcel(HttpServletResponse response, Class<T> head, List<T> data, String excelName,
                                       String sheetName) {
        try {
            // 设置响应头
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里的文件名可以根据实际需求修改
            String fileName = URLEncoder.encode(excelName, "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);

            // 使用 EasyExcel 进行数据导出
            EasyExcel.write(response.getOutputStream(), head)
                    .excelType(ExcelTypeEnum.XLSX)
                    .sheet(sheetName)
                    .doWrite(data);
        } catch (IOException e) {
            log.info("文件导出失败：{}",e.getMessage());
            throw new CustomRuntimeException("文件导出失败");
        }
    }

    public static <T> void exportCsv(HttpServletResponse response, Class<T> head, List<T> data, String excelName,
                                       String sheetName) {
        try {
            // 设置响应头
            response.setContentType("text/csv");
            response.setCharacterEncoding("utf-8");
            // 这里的文件名可以根据实际需求修改
            String fileName = URLEncoder.encode(excelName, "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);

            // 使用 EasyExcel 进行数据导出
            EasyExcel.write(response.getOutputStream(), head)
                    .excelType(ExcelTypeEnum.CSV)
                    .sheet(sheetName)
                    .doWrite(data);
        } catch (IOException e) {
            log.info("文件导出失败：{}",e.getMessage());
            throw new CustomRuntimeException("文件导出失败");
        }
    }


    /**
     * 通用 Excel 导入方法
     * @param inputStream  文件输入流
     * @param entityClass  实体类类型（如 User.class）
     * @param batchConsumer 批量处理逻辑（如保存到数据库）
     * @param batchSize    批处理大小
     */
    // public static <T> void importExcel(InputStream inputStream, Class<T> entityClass,
    //                                    Consumer<List<T>> batchConsumer, int batchSize) {
    //     // 创建监听器并绑定处理逻辑
    //     ReadListener<T> listener = new GenericExcelListener<>(batchConsumer, data -> true, batchSize);
    //
    //     // 执行读取
    //     EasyExcel.read(inputStream, entityClass, listener)
    //             .sheet()
    //             .doRead();
    // }
    //
    // // 简化版（默认批处理大小 100）
    // public static <T> void importExcel(InputStream inputStream, Class<T> entityClass,
    //                                    Consumer<List<T>> batchConsumer) {
    //     importExcel(inputStream, entityClass, batchConsumer, 100);
    // }
}
